package cn.fang2chen.java.distributed.lock.framework;

/**
 * 分布式锁组件
 *
 * @author dcmini chen
 * @since 1.0.0
 */
public interface DistributedLockFactory<T> {

    /**
     * 创建一个分布式锁对象
     *
     * 该方法必须是线程安全的。
     */
    T create(RemoteLockParam remoteLockParam);

    /**
     * 尝试获取一个分布式锁
     */
    T tryGet(String lockPath);

    /**
     * 尝试获取，如果不存在则创建一个
     */
    default T tryGetIfNullCreate(RemoteLockParam remoteLockParam){
        synchronized (this) {
            T distributedLock = tryGet(remoteLockParam.getLockPath());
            if (distributedLock != null) {
                return distributedLock;
            }

            return create(remoteLockParam);
        }
    }


}
